﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DataAccessLayer;
using BussinessEntity;
using Utilities;
using System.Data;
using Configurations;

namespace BussinessLayer
{
    public class ServiceManager
    {
        private static ServiceDA adapter = new ServiceDA();

        static ActionResult<Service> Parser(DataRow row)
        {
            ActionResult<Service> rs = new ActionResult<Service>();
            Service tc = new Service();
            if (row.ItemArray.Length < 5)
            {
                rs.AddException(new Exception("Các cột dữ liệu không đủ."));
                return rs;
            }

            /// Mã dịch vụ
            if (String.IsNullOrEmpty(row.ItemArray[0].ToString().Trim()))
                rs.AddException(new Exception("Mã dịch vụ không hợp lệ: " + row.ItemArray[0].ToString().Trim() + ". "));
            else
                tc.ServiceID = row.ItemArray[0].ToString().Trim();
            
            // Tên dịch vụ
            if (String.IsNullOrEmpty(row.ItemArray[1].ToString().Trim()))
                rs.AddException(new Exception("Tên dịch vụ không hợp lệ: " + row.ItemArray[1].ToString().Trim() + ". "));
            else
                tc.ServiceName = row.ItemArray[1].ToString().Trim();

            // Loại dịch vụ
            if (String.IsNullOrEmpty(row.ItemArray[2].ToString().Trim()) || !(row.ItemArray[2].ToString().Trim() == ServiceState.CaiDatPhanMem || row.ItemArray[2].ToString().Trim() == ServiceState.ThayPhanCung || row.ItemArray[2].ToString().Trim() == ServiceState.SuaPhanCung))
                rs.AddException(new Exception("Loại dịch vụ không hợp lệ: " + row.ItemArray[2].ToString().Trim() + ". "));
            else
                tc.ServiceCategory = row.ItemArray[2].ToString().Trim();

            // Số lượng

            int i = 0;
            if (tc.ServiceCategory == ServiceState.ThayPhanCung)
            {
                if (!int.TryParse(row.ItemArray[3].ToString().Trim(), out i))
                    rs.AddException(new Exception("Số lượng không hợp lệ: " + row.ItemArray[3].ToString().Trim() + ". "));
                else
                    tc.Quantity = i;
            }
            else
                tc.Quantity = 0;

            // Đơn giá
            long gia = DataUtil.ChangeStringToMoney(row.ItemArray[4].ToString().Trim());
            if (gia == 0)
                rs.AddException(new Exception("Đơn giá không hợp lệ: " + row.ItemArray[4].ToString().Trim() + ". "));
            else
                tc.UnitPrice = gia;
            rs.Object = tc;
            return rs;
        }

        public static ActionResult<Service> Insert(DataTable table)
        {
            ActionResult<Service> result = new ActionResult<Service>();
            int dong = 1;
            foreach (DataRow row in table.Rows)
            {
                string error = "Dòng " + dong + ": \r\n";
                ActionResult<Service> rs = Parser(row);
                if (rs.Success)
                {
                   ActionResult<Service> rs1 = Insert(rs.Object);
                   if (rs1.Success)
                   {
                       result.Array.Add(rs.Object);
                   }
                   else
                       error += rs1.ToString();
                }
                else
                    error += rs.ToString();

                if (error != "Dòng " + dong++ + ": \r\n")
                    result.AddException(new Exception(error));
            }
            return result;
        }

        public static ActionResult<Service> Insert(Service entity)
        {
            return adapter.Insert(entity);
        }

        public static ActionResult<Service> Update(Service entity)
        {
            return adapter.Update(entity);
        }

        public static ActionResult<Service> Delete(string MaDV)
        {
            return adapter.Delete(MaDV);
        }

        public static ActionResult<Service> GetAll()
        {
            return adapter.GetAll();
        }


        public static ActionResult<Service> GetAllHardware()
        {
            return adapter.GetAllHardware();
        }

        public static ActionResult<Service> GetSingle(string MaDV)
        {
            return adapter.GetSingle(MaDV);
        }

        public static string NextID()
        {
            return adapter.NextID();
        }
    }
}
